/*
 * Copyright 2019, gRPC Authors All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import Foundation
import GRPC
import NIO

class PercentEncoding: Benchmark {
  let message: String
  let allocator = ByteBufferAllocator()

  let iterations: Int

  init(iterations: Int, requiresEncoding: Bool) {
    self.iterations = iterations
    if requiresEncoding {
      // The message is used in the interop-tests.
      self.message = "\t\ntest with whitespace\r\nand Unicode BMP ☺ and non-BMP 😈\t\n"
    } else {
      // The message above is 62 bytes long.
      self.message = String(repeating: "a", count: 62)
    }
  }

  func setUp() throws {}

  func tearDown() throws {}

  func run() throws {
    var totalLength: Int = 0

    for _ in 0 ..< self.iterations {
      var buffer = self.allocator.buffer(capacity: 0)

      let marshalled = GRPCStatusMessageMarshaller.marshall(self.message)!
      let length = buffer.writeString(marshalled)
      let unmarshalled = GRPCStatusMessageMarshaller.unmarshall(buffer.readString(length: length)!)

      totalLength += unmarshalled.count
    }
  }
}
